package ec.edu.ups.cidi.siia.plamdep.utils.hilos;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ProcessPool 
{
	//Atributos...
	private List<ProcesoGestionado>procesos ;//lista de procesos a ejecutar
	private int paralelos=1;
	private long timeoutProcess;
	private int procesosEjecutados=0;
//	private List<Process>procesosEjecucion =new ArrayList<Process>();//lista de procesos a ir ejecutando
	
	/**
	 * Escucha los eventos en los procesos
	 */
	ProcessListener listener=new ProcessListener() {
		public void onStart() 
		{
		}
		public void onError(Exception e) 
		{
			
		}
		public void onEnd() 
		{
			System.out.println("End");
			if(procesos.size()>0)
			{
				ProcesoGestionado p=procesos.get(0);
				p.setTimeout(timeoutProcess);
				p.addListenner(listener);
				p.arrancarProceso();
				procesos.remove(0);
			}
			procesosEjecutados++;
			
		}
		public void onTimeout() 
		{
			System.out.println("Timeout");
			
		}
	};		

	
	//Constructores
	public ProcessPool()
	{
		procesos =new ArrayList<ProcesoGestionado>();
	}
	
	public ProcessPool(List<ProcesoGestionado> procesos, int paralelos,	long timeoutProcess) {
		this.procesos = procesos;
		this.paralelos = paralelos;
		this.timeoutProcess = timeoutProcess;
	}
	public ProcessPool(int paralelos,	long timeoutProcess) 
	{
		this.paralelos = paralelos;
		this.timeoutProcess = timeoutProcess;
		procesos =new ArrayList<ProcesoGestionado>();
	}
	
	
	
	
	
	//Operaciones
	/**
	 * Agrega un proceso al pool
	 * @param proceso
	 */
	public void addProcess(ProcesoGestionado	proceso)
	{
		if(proceso!=null)
			procesos.add(proceso);
	}
		
	/**
	 * Ejecuta todos los hilos....
	 */
	public void ejecutar()
	{
		int totalProcesos=procesos.size();
		
		for(int i=0;i<paralelos&&i<procesos.size();i++)
		{
			ProcesoGestionado p=procesos.get(0);
			p.addListenner(listener);
			p.arrancarProceso();
			procesos.remove(0);
		}
		while(procesosEjecutados<totalProcesos)
		{
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
	
	//**Encapsulacion*/
	public List<ProcesoGestionado> getProcesos() {
		return procesos;
	}
	public void setProcesos(List<ProcesoGestionado> procesos) {
		this.procesos = procesos;
	}
	public int getParalelos() {
		return paralelos;
	}
	public void setParalelos(int paralelos) {
		this.paralelos = paralelos;
	}
	public long getTimeoutProcess() {
		return timeoutProcess;
	}
	public void setTimeoutProcess(long timeoutProcess) {
		this.timeoutProcess = timeoutProcess;
	}
}
